James 趁著這一次的事件,告訴小艾該怎麼進行 Runtime Debug。
James 打開 Visual Studio 為小艾解釋著如何加入 log4net 來記錄 Runtime 的過程。
「首先先加入 log4net 的參考」James 從 Apache log4net 下載了最新版的 log4net DLL,並將他加入方案的參考當中。(圖1)
圖1:log4net Reference
「接下來,在 AssemblyInfo.VB 中加入這一行設定」
< Assembly: log4net.Config. XMLConfigurator (ConfigFile:="Web.config" , Watch:= True)>
AssemblyInfo.VB
Imports System
Imports System.Reflection
Imports System.Runtime.InteropServices
' 組件的一般資訊是由下列的屬性集
' 控制。變更這些屬性值可修改與組件關聯的
' 資訊。
' 檢閱組件屬性的值
<Assembly: AssemblyTitle("ERP" )>
<Assembly: AssemblyDescription("" )>
<Assembly: AssemblyCompany("" )>
<Assembly: AssemblyProduct("ERP" )>
<Assembly: AssemblyCopyright("Copyright © 2012" )>
<Assembly: AssemblyTrademark("" )>
<Assembly: ComVisible(False )>
'下列 GUID 為專案公開 (Expose) 至 COM 時所要使用的 typelib ID
<Assembly: Guid("8f5824e4-c8d9-4605-8c69-4e320150bc76" )>
' 組件的版本資訊是由下列四項值構成:
'
' 主要版本
' 次要版本
' 組建編號
' 修訂編號
'
' 您可以指定所有的值,也可以依照以下的方式,使用 '*' 將組建和修訂編號
' 指定為預設值:
' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("1.0.0.0" )>
<Assembly: AssemblyFileVersion("1.0.0.0" )>
<Assembly: log4net.Config. XMLConfigurator(ConfigFile:="Web.config" , Watch:=True)>
「同時 Web.Config 也要加入相關的設定參數。」James 將 Web Config 打開,並解說著相關設定的地方。
「在 configSections 中,加入這一段。」
<section name = "log4net " type = "log4net.Config.Log4NetConfigurationSectionHandler, log4net " />
「然後要加入 log4net 的 Config 區塊,log4net 提供了很多樣的 log 記錄型態(註1),我研究了一下大概有兩個比較好用的設定,RollingFileAppender 和 SmtpAppender 這兩種。」
James 解釋著這兩種 Appender 的使用方式,並將其相關設定大致說明。「這些 log4net 的 Project 中都有詳細的說明,而且網路上也可以找到很多教學文件,對 Runtime Debug 來說,非常有用。」
Web.Config
<section name = "log4net" type = "log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
<configSections>
<sectionGroup name ="applicationSettings " type ="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name ="ERP.My.MySettings " type ="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission= "false" />
</sectionGroup>
<section name ="log4net " type ="log4net.Config.Log4NetConfigurationSectionHandler, log4net "/>
</configSections>
<log4net>
<root>
<level value ="WARN "/>
<appender-ref ref ="RollingFileAppender "/>
<appender-ref ref ="SmtpAppender "/>
</root>
<logger name ="ERP.Logging ">
<level value ="DEBUG "/>
</logger>
<appender name ="RollingFileAppender " type ="log4net.Appender.RollingFileAppender ">
<file value ="log\ERP.log "/>
<appendToFile value ="true "/>
<rollingStyle value ="Date "/>
<datePattern value ="yyyyMMdd "/>
<layout type ="log4net.Layout.PatternLayout">
<conversionPattern value ="%date %-5level - %message%newline "/>
</layout>
</appender>
<appender name ="SmtpAppender" type ="log4net.Appender.SmtpAppender,log4net ">
<to value ="XXXXX@abc.com.tw "/>
<from value ="XXXXX@abc.com.tw "/>
<subject value ="[ERP Web App]--Log Information "/>
<smtpHost value ="10.2.32.168 "/>
<bufferSize value ="512 "/>
<lossy value ="true "/>
<evaluator type ="log4net.Core.LevelEvaluator,log4net ">
<threshold value ="WARN "/>
</evaluator>
<layout type ="log4net.Layout.PatternLayout,log4net">
<conversionPattern value ="%newline%date %-5level - %message%newline%newline%newline "/>
</layout>
</appender>
</log4net>
「設定完之後,只是讓程式具備有 log 的功能,要輸出資訊,還需要在程式中寫一些 Code。」
「好複雜喔!」小艾聽到這邊,已經忍不出插上一句。
James 笑了笑,「複雜的在剛剛設定的那一部分都講完了,程式中只要知道怎麼用就好了。剩下一點點,別急。」
James 在原先 qryPO_parts.aspx.vb 中加入 log4net 的 Imports。
Imports log4net
Imports log4net.Config
並透過 LogMnager.GetLogger 產生一個 log 的 Instance,
Public Class qryPO_Parts
Inherits System.Web.UI. Page
Private log As ILog = LogManager.GetLogger( "ERP.Logging")
「在程式的區塊中,可以透過 log.Info、log.Debug、log.Error 來記錄輸出的 Information,這樣看 Log 的時候,可以很清楚的知道這些資訊代表的意義。」
log.Info
log.Debug
log.Error
James 最後開啟執行的 log 檔以及測試一個錯誤,讓系統發出 log 警示的 email。(註1)(圖2)(圖3)
圖2:ERP.log
圖3:Log email
「這樣真的蠻有用的,也不用花太多心思去設計 log 架構。」小艾看到成果,也覺得這樣的設計方式計省事,又可以達到 Runtime Debug 的需求。
「喔!差點漏掉最重要的部份。在 Web 執行的環境中,要特別為 IIS_IUSERS設定 log 目錄寫入的權限,不然 log 是不會生效的。」(圖4)
圖4:IIS 資料夾權限設定
註1:log4net 發出的 email 通知,mimetype 並沒有指定為 HTML,顯示的資訊並不容易閱讀,這部份還待研究。
我只用過 log4j
講起來也算是同門的
用了log4net之後
就不必
開發測試時顯示一堆訊息
測完又得 comment 掉
除錯時又得加進來
log4net 真的是好物
對 幾乎忘了他的存在 但無時無刻不在